
;;;======================================================
;;;   Sugeridor de películas. Sistema Experto.
;;;
;;;     Héctor Rojas González 
;;;     Néstor J. González López
;;; 
;;;=====================================================
;;;	Para ejecutarlo: 
;;;			(load cine.clp)
;;;			(reset)
;;;			(run)
;;;======================================================

;;****************
;;* DEFFUNCTIONS *
;;****************

(deffunction ask-question (?question $?allowed-values)
   (printout t ?question)
   (bind ?answer (read))
   (if (lexemep ?answer) 
       then (bind ?answer (lowcase ?answer)))
   (while (not (member ?answer ?allowed-values)) do
      (printout t ?question)
      (bind ?answer (read))
      (if (lexemep ?answer) 
          then (bind ?answer (lowcase ?answer))))
   ?answer)

(deffunction yes-or-no-p (?question)
   (bind ?response (ask-question ?question si no s n))
   (if (or (eq ?response si) (eq ?response s))
       then TRUE 
       else FALSE))



;;;***************
;;;* QUERY RULES *
;;;***************

; Lo primero que preguntamos es si vas a ver la pelicula solo o acompañado
(defrule con_gente ""
 
   (not (films ?))
   =>
   (if (yes-or-no-p "¿ Vas a ver la película acompañado (si/no)? ") 
      then (if (yes-or-no-p "¿ Quieres pensar un poco (si/no)? ")
	  	then (assert (de_pensar si)) ; Pensar si, Con_gente si 
	  	else (assert (de_pensar no))); Pensar no, Con_gente si

      else (assert (con_gente no))))

;Reglas para ver acompañado las películas 
; Cuando vas a ver la pelicula acompañado hemos pensado en 3 opciones
; - Con niños
; - Con tu pareja
; - Con amigos


; Generos para ver peliculas con niños: Animación y aventuras
(defrule con_ninos ""
	(de_pensar no)
	=>
	(if (yes-or-no-p "¿ Hay niños  (si/no)? ")
	    	then (if (yes-or-no-p "¿ Quiere ver cine de Animación (si/no)? ") 
			then (assert (films "Genero: Animacion Sugerencias: Toy Story, Wall-e, El Rey Leon")(respuesta_final si))
			else (assert (animacion no)))
	else (assert (con_ninos no))))

; Regla para los fan de Harry Potter
(defrule aventuras ""
	(animacion no)
 	=>
	(if (yes-or-no-p "¿ Los niños son lectores de literatura infantil, juvenil (si/no)? ")
		then (assert (films "Sugerencias: La Saga Harry Potter, Saga de Narnia")(respuesta_final_ninos si))
		else (assert (films "Genero: Aventuras Sugerencias: Gooneys, Et, Spy Kids")(respuesta_final_ninos si))))

; Generos para ver peliculas en pareja: Comedia Romántica y Eróticas
(defrule en_pareja ""
	(con_ninos no)
	=>
	(if (yes-or-no-p "¿ Estas con tu pareja  (si/no)? ")
	    then (if (yes-or-no-p "¿ Te apetece ver carne(si/no)? ") 
			then (assert (films "Genero: Erotico Sugerencias: Emanuele, Orquidea Salvaje")(respuesta_final si))
			else (assert (films "Genero: Comedia Romantica Sugerencias: Pretty Woman, 4 Bodas y un funeral, Alfie ")(respuesta_final si)))
	else (assert (en_pareja no))))

; Generos para ver peliculas con amigos: Comedia y Acción
(defrule con_amigos ""
   	(en_pareja no)
   	=>
	(if (yes-or-no-p "¿ Quieres algo emocionante (si/no) ? ")
		then (assert (films "Genero: Accion Sugerencias: Die Hard, Rambo, Depredor ")(respuesta_final si))
		else (assert (films "Genero: Comedia Sugerencias: Resacon en la vegas, EL golpe, Juerga de Solteros" )(respuesta_final si))))

;Reglas para ver solo las películas 

; Películas de fantasia y ciencia ficción
(defrule fantasia ""
   	(con_gente no)
   	=>
	(if (yes-or-no-p "¿ Quieres pensar un poco (si/no) ? ")
		then (if (yes-or-no-p "¿ Te apece evadirte de la realidad (si/no) ? ")
	    		then (if (yes-or-no-p "¿ Te gustan las espadas (si/no)? ") 
				then (assert (films "Genero: Fantasia Sugerencias: El señor de los añillos, Conan , Willow")(respuesta_final si))
				else (assert (espadas no)))
		else (assert (fantasia no)))

	 else (assert (de_pensar2 no)))); Pensar no, Con_gente no

; Ciencia-ficcion
(defrule ciencia_ficcion ""
	(espadas no)
	=>
	(if (yes-or-no-p "¿ Quieres viajar a mundos lejanos y descubrir nuevas civilizaciones (si/no) ? ")
		then (assert (films "Genero: Ciencia Ficción Espacial  Sugerencias: Saga Star Wars, Saga StarTrek, Stargate  ")(respuesta_final si))
		else (assert (films "Genero: Ciencia Ficción Sugerencias: La Amenaza de Andromeda, Matrix, Inception  ")(respuesta_final si))))


; Thillers
(defrule thiller ""
	(fantasia no)
	=>
	(if (yes-or-no-p "¿ Quieres ver algún chingo de sangre (si/no) ? ")
		then (assert (films "Genero: thiller Segurencias: Seven, El Silencio de los corderos")(respuesta_final si))
		else (assert (thiller no))))

; Peliculas historicas y bélicas
(defrule historico ""
   	(thiller no)
   	=>
	(if (yes-or-no-p "¿ Quiere ver una peli de época escribe (si) o si quieres ver algo con más contenido escribe (no) ? ")
		then (if (yes-or-no-p "¿ Has tenido un mal dia y quieres ver morir gente (si/no) ? ")
				then (assert (films "Genero: Bélico Segurencias: PLatoon, la Chaqueta Metalica, los 12 del Patíbulo")(respuesta_final si))
				else (assert (films "Genero: Histórico Sugerencias: Ben Hur, Braveheart, Espartaco ")(respuesta_final si)))
		else (assert (con_contenido si))))

; Peliculas de acción y terror
(defrule accion ""
   	(de_pensar2 no)
   	=>
	(if (yes-or-no-p "¿ Quieres tener escalofrios (si/no) ? ")
		then (assert (films "Genero: Terror Segurencias: Drácula, La profecia, La matanza de Texas")(respuesta_final si))
		else (assert (films "Genero: Accion Sugerencias: Die Hard, Rambo, Depredador ")(respuesta_final si))))

; Esta regla se ejecuta con un or y se ejecuta tanto si vamos a ver una película solo o acompañado.
(defrule documental ""
   	(or (con_contenido si)
		(de_pensar si))
   	=>
	(assert (films "Genero: Documental Sugerencias: Inside Job, Super Size Me, Bollowing for Columbine")(respuesta_final si)))

; Regla final,  pregunta si te ha gustado la respuesta en caso de que no, te da una lista de clásico del cine 
(defrule final ""
   	(respuesta_final si)
   	=>
	(if (yes-or-no-p "¿ Te ha gustado la respuesta (si/no) ? ")
		then (assert (films "Gracias por usar este servico"))
		else (assert (films "Te recomendamos algunos de estos clásicos: Casablanca, El Padrino, El Bueno el Feo y el Malo, 12 Hombres sin piedad, la Lista de Schindler"))))

(defrule final_ninos ""
   	(respuesta_final_ninos si)
   	=>
	(if (yes-or-no-p "¿ Te ha gustado la respuesta (si/no) ? ")
		then (assert (films "Gracias por usar este servico"))
		else (assert (films "Te recomendamos este clásico para toda la familia: Merry Poppins"))))

;;;****************************
;;;* STARTUP AND REPAIR RULES *
;;;****************************

(defrule system-banner ""
  (declare (salience 10))
  =>
  (printout t crlf crlf)
  (printout t "Sugeridor de Películas")
  (printout t crlf crlf))

(defrule print-films ""
  (declare (salience 10))
  (films ?item)
  =>
  (printout t crlf crlf)
  (printout t "Respuesta:")
  (printout t crlf crlf)
  (format t " %s%n%n%n" ?item))

